export class CombinatorialPaternity {
  constructor() {}
  structure(array: any[]) {
    // 第一步，将数组装换成对象，可以将一个具有父子关系的数组转换为一个以id为key的对象
    const arrayToObj = (array = []) => {
      const obj = {};
      array.forEach((item) => {
        // 避免改变源数据，建议克隆（此处浅克隆）
        obj[`${item.id}`] = Object.assign({}, item);
      });
      return obj;
    };
    const obj = arrayToObj(array);
    // 根节点
    let root = [];
    // 第二步，再遍历一遍数组，从中找到【根节点】以及将子节点放到各自的父节点children属性里
    array.forEach(({ id, parentId }) => {
      // 从克隆后的对象里面取节点值
      const node = obj[`${id}`];
      // 没有parentId则是根节点

      if (!parentId) {
        if (!~root.findIndex((ele) => ele.id === id)) {
          root.push(node);
        }
      } else if (obj[`${parentId}`]) {
        // children属性保存子节点
        if (!obj[`${parentId}`].children) {
          obj[`${parentId}`].children = [];
        }
        obj[`${parentId}`].children.push(node);
      }
    });

    function aa(arr) {
      arr.forEach((item, index) => {
        if (item.children) {
          item.children.sort((a, b) => {
            return a.sort - b.sort;
          });
          aa(item.children);
        }
      });
    }
    aa(root);
    return root;
    // 第二遍遍历完成后，根节点即包含所有的子孙节点，总共遍历两次
  }
}
